package com.hz.score.ent.service;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.hz.score.common.dto.PageDto;
import com.hz.score.common.exception.ScoreException;
import com.hz.score.common.util.ConvertUtil;
import com.hz.score.cus.dto.CusInfoDto;
import com.hz.score.cus.service.CusService;
import com.hz.score.ent.dto.EntBaseInfoDto;
import com.hz.score.ent.dto.EntCommInfoDto;
import com.hz.score.ent.mapper.EntBaseMapper;
import com.hz.score.ent.mapper.EntCommMapper;
import com.hz.score.ent.model.EntBaseInfo;
import com.hz.score.ent.model.EntCommInfo;
import com.hz.score.msg.event.EntBaseInfoEvent;
import org.springframework.beans.BeanUtils;
import org.springframework.context.ApplicationEventPublisher;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

@Service
public class EntService {

    @Resource
    EntBaseMapper entBaseMapper;

    @Resource
    EntCommMapper entCommMapper;

    @Resource
    private ApplicationEventPublisher applicationEventPublisher;

    @Resource
    CusService cusService;

    public PageDto<EntBaseInfoDto> pageBaseEnt(EntBaseInfoDto entBaseInfoDto, Integer pageSize, Integer pageNum) {
        QueryWrapper wrapper = new QueryWrapper();
        if (entBaseInfoDto.getCoId()!= null) wrapper.eq("co_id", entBaseInfoDto.getCoId());
        if (entBaseInfoDto.getBizTyp()!= null) wrapper.eq("biz_typ", entBaseInfoDto.getBizTyp());
        return ConvertUtil.convertPage(entBaseMapper.selectPage(new Page<>(pageNum, pageSize), wrapper), EntBaseInfoDto.class);
    }

    public List<EntBaseInfoDto> listBaseEnt(EntBaseInfoDto entBaseInfoDto) {
        QueryWrapper wrapper = new QueryWrapper();
        if (entBaseInfoDto.getCoId()!= null) wrapper.eq("co_id", entBaseInfoDto.getCoId());
        if (entBaseInfoDto.getBizTyp()!= null) wrapper.eq("biz_typ", entBaseInfoDto.getBizTyp());
        return ConvertUtil.convertList(entBaseMapper.selectList(wrapper), EntBaseInfoDto.class);
    }

    public int newBaseEnt(EntBaseInfoDto entBaseInfoDto) {
        CusInfoDto cusInfoDto = cusService.getCusByBizTyp(entBaseInfoDto.getBizTyp());
        if (cusInfoDto == null) {
            throw new ScoreException("cus do not exist");
        }
        EntBaseInfo entBaseInfoOld = entBaseMapper.getEntBaseInfoByCreCod(entBaseInfoDto.getCreCod());
        int result;
        EntBaseInfo entBaseInfo = new EntBaseInfo();
        if (entBaseInfoOld == null) {
            BeanUtils.copyProperties(entBaseInfoDto, entBaseInfo);
            entBaseInfo.setCreTim(new Date());
            entBaseInfo.setBizTypCode(cusInfoDto.getBizTypCode());
            result = entBaseMapper.insert(entBaseInfo);
        } else {
            BeanUtils.copyProperties(entBaseInfoDto, entBaseInfo);
            entBaseInfo.setId(entBaseInfoOld.getId());
            entBaseInfo.setCoId(entBaseInfoOld.getCoId());
            entBaseInfo.setCreCod(entBaseInfoOld.getCreCod());
            entBaseInfo.setUpdTim(new Date());
            entBaseInfo.setBizTypCode(cusInfoDto.getBizTypCode());
            result = entBaseMapper.updateById(entBaseInfo);
        }
        if (result > 0) {
            EntBaseInfoEvent entBaseInfoEvent = new EntBaseInfoEvent(this);
            BeanUtils.copyProperties(entBaseInfo, entBaseInfoEvent);
            applicationEventPublisher.publishEvent(entBaseInfoEvent);
        }
        return result;
    }

    public int delBaseEnt(EntBaseInfoDto entBaseInfoDto) {
        EntBaseInfo entBaseInfo = new EntBaseInfo();
        BeanUtils.copyProperties(entBaseInfoDto, entBaseInfo);
        return entBaseMapper.deleteById(entBaseInfo);
    }

    public EntBaseInfoDto getBaseEnt(Long id) {
        EntBaseInfo entBaseInfo =  entBaseMapper.selectById(id);
        if (entBaseInfo != null) {
            EntBaseInfoDto entBaseInfoDto = new EntBaseInfoDto();
            BeanUtils.copyProperties(entBaseInfo, entBaseInfoDto);
            return entBaseInfoDto;
        }
        return null;
    }

    public PageDto<EntCommInfoDto> pageCommEnt(EntCommInfoDto entCommInfoDto, Integer pageSize, Integer pageNum) {
        QueryWrapper wrapper = new QueryWrapper();
        if (entCommInfoDto.getName() != null) wrapper.eq("name", entCommInfoDto.getName());
        if (entCommInfoDto.getBizTyp() != null) wrapper.eq("biz_typ", entCommInfoDto.getBizTyp());
        return ConvertUtil.convertPage(entCommMapper.selectPage(new Page<>(pageNum, pageSize), wrapper), EntCommInfoDto.class);
    }

    public int newCommEnt(EntCommInfoDto entCommInfoDto) {
        EntCommInfo entCommInfo = new EntCommInfo();
        BeanUtils.copyProperties(entCommInfoDto, entCommInfo);
        return entCommMapper.insert(entCommInfo);
    }

    public int updateCommEnt(EntCommInfoDto entCommInfoDto) {
        EntCommInfo entCommInfo = new EntCommInfo();
        BeanUtils.copyProperties(entCommInfoDto, entCommInfo);
        return entCommMapper.updateById(entCommInfo);
    }

    public int delCommEnt(EntCommInfoDto entCommInfoDto) {
        EntCommInfo entCommInfo = new EntCommInfo();
        BeanUtils.copyProperties(entCommInfoDto, entCommInfo);
        return entCommMapper.deleteById(entCommInfo);
    }

    public EntCommInfoDto getCommEnt(Long id) {
        EntCommInfo entCommInfo =  entCommMapper.selectById(id);
        if (entCommInfo != null) {
            EntCommInfoDto entCommInfoDto = new EntCommInfoDto();
            BeanUtils.copyProperties(entCommInfo, entCommInfoDto);
            return entCommInfoDto;
        }
        return null;
    }

    public List<EntCommInfoDto> getCommEnts(List<Long> ids) {
        List<EntCommInfoDto> entCommInfoDtoList = new ArrayList<>();
        List<EntCommInfo> entCommInfoList =  entCommMapper.selectBatchIds(ids);
        entCommInfoList.forEach(entCommInfo -> {
            EntCommInfoDto entCommInfoDto = new EntCommInfoDto();
            BeanUtils.copyProperties(entCommInfo, entCommInfoDto);
            entCommInfoDtoList.add(entCommInfoDto);
        });

        return entCommInfoDtoList;
    }
}
